/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.regressao.linear.formulas;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.List;

/**
 *
 * @author Rodrigo Moreira Alexandre
 * @author Fernando Aparecido Paulo
 */
public class Calculo {

    /**
     *
     * @param n
     * @param listaX
     * @param listaY
     * @return
     */
    public BigDecimal r(BigDecimal n, List<Double> listaX, List<Double> listaY) {
        BigDecimal somaX = BigDecimal.ZERO;
        BigDecimal somaY = BigDecimal.ZERO;
        BigDecimal somaX2 = BigDecimal.ZERO;
        BigDecimal somaY2 = BigDecimal.ZERO;
        BigDecimal somaXY = BigDecimal.ZERO;
        for (Double x : listaX) {
            somaX = somaX.add(new BigDecimal(x));
        }
        for (Double x2 : listaX) {
            somaX2 = somaX2.add(new BigDecimal(x2).pow(2));
        }
        for (Double y : listaY) {
            somaY = somaY.add(new BigDecimal(y));
        }
        for (Double y2 : listaY) {
            somaY2 = somaY2.add(new BigDecimal(y2).pow(2));
        }
        for (int i = 0; i < n.intValue(); i++) {
            somaXY = somaXY.add(new BigDecimal(listaX.get(i) * listaY.get(i)));
        }
        BigDecimal dividendo = n.multiply(somaXY).subtract(somaX.multiply(somaY)).setScale(4, RoundingMode.HALF_UP);
        double valorRaizX = Math.sqrt(n.multiply(somaX2).subtract(somaX.pow(2)).setScale(4, RoundingMode.HALF_UP).doubleValue());
        double valorRaizY = Math.sqrt(n.multiply(somaY2).subtract(somaY.pow(2)).setScale(4, RoundingMode.HALF_UP).doubleValue());
        double resultadoDivisor = valorRaizX * valorRaizY;
        if (resultadoDivisor != 0.00) {
            BigDecimal resultadoR = dividendo.divide(new BigDecimal(resultadoDivisor), MathContext.DECIMAL32).setScale(4, RoundingMode.HALF_UP);
            return resultadoR;
        }
        return BigDecimal.ZERO;
    }

    public BigDecimal rDois(BigDecimal n, List<Double> listaX, List<Double> listaY) {
        BigDecimal somaX = BigDecimal.ZERO;
        BigDecimal somaY = BigDecimal.ZERO;
        BigDecimal somaX2 = BigDecimal.ZERO;
        BigDecimal somaY2 = BigDecimal.ZERO;
        BigDecimal somaXY = BigDecimal.ZERO;
        for (Double x : listaX) {
            somaX = somaX.add(new BigDecimal(x));
        }
        for (Double x2 : listaX) {
            somaX2 = somaX2.add(new BigDecimal(x2).pow(2));
        }
        for (Double y : listaY) {
            somaY = somaY.add(new BigDecimal(y));
        }
        for (Double y2 : listaY) {
            somaY2 = somaY2.add(new BigDecimal(y2).pow(2));
        }
        for (int i = 0; i < n.intValue(); i++) {
            somaXY = somaXY.add(new BigDecimal(listaX.get(i) * listaY.get(i)));
        }
        BigDecimal dividendo = n.multiply(somaXY).subtract(somaX.multiply(somaY)).setScale(4, RoundingMode.HALF_UP);
        double valorRaizX = Math.sqrt(n.multiply(somaX2).subtract(somaX.pow(2)).setScale(4, RoundingMode.HALF_UP).doubleValue());
        double valorRaizY = Math.sqrt(n.multiply(somaY2).subtract(somaY.pow(2)).setScale(4, RoundingMode.HALF_UP).doubleValue());
        double resultadoDivisor = valorRaizX * valorRaizY;
        if (resultadoDivisor != 0.00) {
            BigDecimal resultado = dividendo.divide(new BigDecimal(resultadoDivisor), MathContext.DECIMAL32).setScale(4, RoundingMode.HALF_UP);
            return resultado.pow(2).multiply(BigDecimal.valueOf(100));
        }
        return BigDecimal.ZERO;
    }

    public BigDecimal b(BigDecimal n, List<Double> listaX, List<Double> listaY) {
        BigDecimal somaX = BigDecimal.ZERO;
        BigDecimal somaY = BigDecimal.ZERO;
        BigDecimal somaX2 = BigDecimal.ZERO;
        BigDecimal somaY2 = BigDecimal.ZERO;
        BigDecimal somaXY = BigDecimal.ZERO;
        for (Double x : listaX) {
            somaX = somaX.add(new BigDecimal(x));
        }
        for (Double x2 : listaX) {
            somaX2 = somaX2.add(new BigDecimal(x2).pow(2));
        }
        for (Double y : listaY) {
            somaY = somaY.add(new BigDecimal(y));
        }
        for (Double y2 : listaY) {
            somaY2 = somaY2.add(new BigDecimal(y2).pow(2));
        }
        for (int i = 0; i < n.intValue(); i++) {
            somaXY = somaXY.add(new BigDecimal(listaX.get(i) * listaY.get(i)));
        }
        BigDecimal dividendo = n.multiply(somaXY).subtract(somaX.multiply(somaY), MathContext.DECIMAL32).setScale(4, RoundingMode.HALF_UP);
        BigDecimal resultadoDivisor = n.multiply(somaX2).subtract(somaX.pow(2), MathContext.DECIMAL32).setScale(4, RoundingMode.HALF_UP);
        if (resultadoDivisor.doubleValue() != 0.00) {
            BigDecimal resultadoB = dividendo.divide(resultadoDivisor, MathContext.DECIMAL32);
            return resultadoB;
        }

        return BigDecimal.ZERO;

    }

    public BigDecimal a(BigDecimal n, List<Double> listaX, List<Double> listaY) {
        BigDecimal somaX = BigDecimal.ZERO;
        BigDecimal somaY = BigDecimal.ZERO;
        BigDecimal somaX2 = BigDecimal.ZERO;
        BigDecimal somaY2 = BigDecimal.ZERO;
        BigDecimal somaXY = BigDecimal.ZERO;
        for (Double x : listaX) {
            somaX = somaX.add(new BigDecimal(x));
        }
        for (Double x2 : listaX) {
            somaX2 = somaX2.add(new BigDecimal(x2).pow(2));
        }
        for (Double y : listaY) {
            somaY = somaY.add(new BigDecimal(y));
        }
        for (Double y2 : listaY) {
            somaY2 = somaY2.add(new BigDecimal(y2).pow(2));
        }
        for (int i = 0; i < n.intValue(); i++) {
            somaXY = somaXY.add(new BigDecimal(listaX.get(i) * listaY.get(i)));
        }

        BigDecimal dividendo = n.multiply(somaXY).subtract(somaX.multiply(somaY), MathContext.DECIMAL32).setScale(4, RoundingMode.HALF_UP);
        BigDecimal resultadoDivisor = n.multiply(somaX2).subtract(somaX.pow(2), MathContext.DECIMAL32).setScale(4, RoundingMode.HALF_UP);
        if (resultadoDivisor.doubleValue() != 0.00) {
            BigDecimal resultadoB = dividendo.divide(resultadoDivisor, MathContext.DECIMAL32);
            BigDecimal resultadoA = somaY.subtract((resultadoB.multiply(somaX, MathContext.DECIMAL32))).divide(n, MathContext.DECIMAL32).setScale(4, RoundingMode.HALF_UP);
            System.out.println(resultadoA);
            return resultadoA;
        }
        return BigDecimal.ZERO;

    }

    public BigDecimal y(BigDecimal n, List<Double> listaX, List<Double> listaY) {
        BigDecimal somaX = BigDecimal.ZERO;
        BigDecimal somaY = BigDecimal.ZERO;
        BigDecimal somaX2 = BigDecimal.ZERO;
        BigDecimal somaY2 = BigDecimal.ZERO;
        BigDecimal somaXY = BigDecimal.ZERO;
        for (Double x : listaX) {
            somaX = somaX.add(new BigDecimal(x));
        }
        for (Double x2 : listaX) {
            somaX2 = somaX2.add(new BigDecimal(x2).pow(2));
        }
        for (Double y : listaY) {
            somaY = somaY.add(new BigDecimal(y));
        }
        for (Double y2 : listaY) {
            somaY2 = somaY2.add(new BigDecimal(y2).pow(2));
        }
        for (int i = 0; i < n.intValue(); i++) {
            somaXY = somaXY.add(new BigDecimal(listaX.get(i) * listaY.get(i)));
        }

        BigDecimal dividendo = n.multiply(somaXY).subtract(somaX.multiply(somaY), MathContext.DECIMAL32).setScale(4, RoundingMode.HALF_UP);
        BigDecimal resultadoDivisor = n.multiply(somaX2).subtract(somaX.pow(2), MathContext.DECIMAL32).setScale(4, RoundingMode.HALF_UP);
        if (resultadoDivisor.doubleValue() != 0.00) {
            BigDecimal resultadoB = dividendo.divide(resultadoDivisor, MathContext.DECIMAL32);
            BigDecimal resultadoA = somaY.subtract((resultadoB.multiply(somaX))).divide(n, MathContext.DECIMAL32).setScale(4, RoundingMode.HALF_UP);
            BigDecimal resultadoY = resultadoA.add(resultadoB);
            return resultadoY;
        }
        return BigDecimal.ZERO;
    }
    
    
    
}
